/*
 * segments.h
 *
 *  Created on: 09/05/2009
 *      Author: alex
 */

#ifndef SEGMENTS_H_
#define SEGMENTS_H_

#include <stdint.h>
#include <sys/time.h>


/**
 * A porta do servidor na qual o cliente deve se conectar.
 */
#define SERVER_PORT 5432


/**
 * Número de pacotes que serão enviados ao todo.
 */
#define NUMPKTS 200


/**
 * Tamanho do segmento que contém a mensagem.
 */
#define SEGMENT_SIZE 512


/**
 * Tamanho da mensagem em cada segmento.
 */
#define MSG_SIZE 506


/**
 * Um segmento para o envio de dados do cliente para o servidor.
 */
typedef struct {
	uint32_t checksum;
	uint16_t seqnum;
	uint8_t msg[MSG_SIZE];
} Segment;


/**
 * Um segmento de ACK que o servidor envia para o cliente confirmando o
 * recebimento dos segmentos com dados.
 */
typedef struct {
	uint32_t checksum;
	uint16_t ack;
} Ack;


/**
 * Segmento de handshake que o cliente envia para o servidor informando as
 * variáveis da simulação.
 */
typedef struct {
	uint16_t rtt;
	uint16_t erro;
} Handshake;


/**
 * Extrai de uma struct timeval o tempo em milissegundos, com alcance até
 * 999.999 segundos.
 *
 * @param time A struct com o tempo
 * @return O tempo em milissegundos
 */
static inline uint32_t to_ms(struct timeval time) {
	return (time.tv_sec % 1000) * 1000 + time.tv_usec / 1000;
}


#endif /* SEGMENTS_H_ */
